import 'dart:io';

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_house_manager/api/user.dart';
import 'package:flutter_house_manager/pages/controller/user_info_controller.dart';
import 'package:flutter_house_manager/utils/cameraDialog.dart';
import 'package:flutter_house_manager/utils/toast.dart';
// Getx中也导出一个FormData类型，但版本落后，应该使用dio中的FormData，将Getx中的隐藏
import 'package:get/get.dart' hide FormData, MultipartFile;
import 'package:image_picker/image_picker.dart';

class ProfilePage extends StatefulWidget {
  const ProfilePage({super.key});

  @override
  State<ProfilePage> createState() => _ProfilePageState();
}

class _ProfilePageState extends State<ProfilePage> {
  // 从共享控制器获取用户信息
  UserInfoController controller = Get.find<UserInfoController>();

  // 输入框控制器
  TextEditingController nickNameController = TextEditingController();

  //临时存储图片路径
  String tempAvatar = '';
  // 临时存储头像的文件名称
  String tempFileName = '';

  // 保存用户信息
  saveUserInfo() async {
    // 1.获取用户输入的昵称
    String nickName = nickNameController.text;
    // 2.内容校验
    // 2.1 昵称不能为空
    if (nickName.isEmpty) {
      PromptAction.showWarning('请输入昵称');
      return;
    }
    // 2.2 昵称只能为中文，字符长度2-8之间
    if (!RegExp(r'^[\u4e00-\u9fa5]{2,8}$').hasMatch(nickName)) {
      PromptAction.showWarning('请输入2-8位中文昵称');
      return;
    }
    //------------------------------------
    // 2.3 头像上传校验
    String avatar = controller.userInfo['avatar'] ?? '';
    if (tempAvatar.isNotEmpty) {
      FormData? data;
      // 网页端
      if (kIsWeb) {
        // 1. 根据图片的临时路径得到二进制文件
        Uint8List list = await XFile(tempAvatar).readAsBytes();
        // 2.获取文件对象
        MultipartFile file =
            MultipartFile.fromBytes(list, filename: tempFileName);
        // 3.创建FormData对象
        data = FormData.fromMap({"file": file, "type": 'avatar'});
      } else {
        // 鸿蒙 安卓 ios
        data = FormData.fromMap(
            {"file": MultipartFile.fromFileSync(tempAvatar), "type": 'avatar'});
      }

      // 4.调用接口
      final res = await uploadAvatarAPI(data);
      avatar = res['url'];
    }
    //------------------------------------
    // 3.调用接口
    await updateUserInfoAPI({'nickName': nickName, 'avatar': avatar});
    // 上传成功后，清空临时变量
    tempAvatar = '';
    tempFileName = '';
    // 4.提示保存成功
    PromptAction.showSuccess('保存成功');
    // 5.同步Getx数据
    controller.userInfo['nickName'] = nickName;
    controller.userInfo['avatar'] = avatar;
    // 5.1 刷新用户信息
    controller.update();
    // 6.返回上一页
    Navigator.pop(context);
  }

  // 更改头像
  // 打开相册获取图片
  openLibrary() async {
    // 1.创建一个选择图片的实例
    ImagePicker picker = ImagePicker();
    // 2. 调用方法打开相册
    // ImageSource.gallery 获取相册图片
    // ImageSource.camera 获取相机图片
    XFile? file = await picker.pickImage(source: ImageSource.gallery);
    // 3. 判断图片是否获取成功
    if (file != null) {
      // PromptAction.showSuccess('获取相册图片成功');
      // 存储图片地址和文件名称
      tempAvatar = file.path;
      tempFileName = file.name;
      // 4. 刷新头像
      setState(() {});
      // 5. 关闭弹窗
      Navigator.of(context).pop();
    }
  }

  openCamera() async {
    // 1.创建一个选择图片的实例
    ImagePicker picker = ImagePicker();
    // 2. 调用方法打开相册
    // ImageSource.gallery 获取相册图片
    // ImageSource.camera 获取相机图片
    XFile? file = await picker.pickImage(source: ImageSource.camera);
    // 3. 判断图片是否获取成功
    if (file != null) {
      // PromptAction.showSuccess('获取相册图片成功');
      // 存储图片地址和文件名称
      tempAvatar = file.path;
      tempFileName = file.name;
      // 4. 刷新头像
      setState(() {});
      // 5. 关闭弹窗
      Navigator.of(context).pop();
    }
  }

  // 拍照
  // 相册
  // 取消

  @override
  void initState() {
    super.initState();
    // 初始化输入框控制器
    nickNameController.text = controller.userInfo['nickName'] ?? '';
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: const Text('个人信息'),
        backgroundColor: Colors.transparent,
        centerTitle: true,
      ),
      body: ListView(
        padding: const EdgeInsets.all(10),
        children: [
          SizedBox(
            height: 40,
            child: Row(
              children: [
                const Text(
                  '头像',
                  style: TextStyle(fontSize: 16),
                ),
                const Spacer(),
                Row(
                  children: [
                    GestureDetector(
                      onTap: () {
                        showCameraDialog(context, onCamera: () {
                          openCamera();
                        }, onLibrary: () {
                          openLibrary();
                        });
                      },
                      child: ClipRRect(
                        borderRadius: BorderRadius.circular(50.0),
                        child: getUserAvatar(),
                      ),
                    ),
                    const Icon(Icons.arrow_forward_ios, size: 12)
                  ],
                )
              ],
            ),
          ),
          Row(
            children: [
              const Text('昵称'),
              const Spacer(),
              Expanded(
                child: TextField(
                  controller: nickNameController,
                  decoration: const InputDecoration(
                    hintText: '请输入昵称',
                    border: InputBorder.none,
                  ),
                  textAlign: TextAlign.right,
                ),
              ),
              const Icon(Icons.arrow_forward_ios, size: 12)
            ],
          ),
          const SizedBox(
            height: 20,
          ),
          Row(
            children: [
              Expanded(
                child: ElevatedButton(
                  style: ElevatedButton.styleFrom(
                    backgroundColor: const Color.fromARGB(255, 85, 145, 175),
                    minimumSize: const Size(100, 50),
                  ),
                  onPressed: () {
                    saveUserInfo();
                  },
                  child: const Text(
                    '保存',
                    style: TextStyle(
                      color: Colors.white,
                      fontSize: 20,
                    ),
                  ),
                ),
              )
            ],
          )
        ],
      ),
    );
  }

  //获取用户头像
  getUserAvatar() {
    if (tempAvatar.isNotEmpty) {
      // web场景下是network
      // 鸿蒙安卓 file相册路径 file://
      if (kIsWeb) {
        return Image.network(
          tempAvatar,
          width: 30,
          height: 30,
          fit: BoxFit.cover,
        );
      } else {
        return Image.file(
          File(tempAvatar),
          width: 30,
          height: 30,
          fit: BoxFit.cover,
        );
      }
    }

    if (controller.userInfo['avatar'] != '' &&
        controller.userInfo['avatar'] != null) {
      return Image.network(
        controller.userInfo['avatar'],
        width: 30,
        height: 30,
        fit: BoxFit.cover,
      );
    }
    return Image.asset(
      'assets/images/avatar_1.jpg',
      width: 30,
      height: 30,
      fit: BoxFit.cover,
    );
  }
}
